#pragma once

#include <stdint.h>
#include <stdio.h>
#include <string>
#include <sstream>
#include "rc.h"
#include "sql/parser/parse_defs.h"

inline bool is_leap_year(int year){
  return (year % 4 == 0 && year % 100 !=0) || year % 400 == 0;
}
inline RC string_to_date(const char *str,int32_t &date){
  int year = 0;
  int month = 0;
  int day = 0;
  int ret = sscanf(str, "%d-%d-%d", &year, &month, &day);
  if(ret != 3){
    return RC::INVALID_ARGUMENT;
  }
  
  //valid date
  if(year < 1900 || year > 9999 || (month <=0 || month >12) || (day <=0 ||day > 31)){
    return RC::INVALID_ARGUMENT;
  }
  int max_day_in_month[] = {31,29,31,30,31,30,31,31,30,31,30,31};
	const int max_day = max_day_in_month[month - 1];
	if(day > max_day){
		return RC::INVALID_ARGUMENT;
	}
	if(month ==2 && !is_leap_year(year) && day > 28){
		return RC::INVALID_ARGUMENT;
	}
	date = year * 10000 + month * 100 + day;//20220601
	if(date>20380200||date<19700101) return RC::INVALID_ARGUMENT;
	return RC::SUCCESS;
}


inline std::string date_to_string(int32_t date){
	std::stringstream ss;
	int year=date/10000;
	int month=date%10000/100;
	int day=date%100;
	ss << year;
	ss << '-';
	if(month<10) ss<< 0;
	ss << month;
	ss << '-';
	if(day<10) ss<< 0;
	ss << day;
	return ss.str();
}
